package com.moyuaninfo.enums;

import cn.hutool.core.collection.CollectionUtil;
import com.moyuaninfo.common.MangerGlobal;
import com.moyuaninfo.utildatamodel.ResultData;
import com.moyuaninfo.utils.AsciiUtils;
import com.moyuaninfo.utils.TxtUtils;

import java.util.List;

/**
 * @author 邱祥霸
 * @version 1.0
 */
public enum  DetectionMessageEnum{

    /** 卡号报文：每隔 1 分钟，上报一次 SIM 卡 ICCID*/
    SIM_ICCID("1001") {

        @Override
        public boolean due(String iccid, String message) {
            String messageData = message.substring(4);
            System.out.println("上报的 SIM 卡 ICCID, 报文内容: " + AsciiUtils.hexToAscii(messageData));

            return true;
        }
    },

    /** 数据报文：发送完 SIM 卡 ICCID 后，设备紧接着发送模拟量数据*/
    DATA("0301") {

        @Override
        public boolean due(String iccid, String message) {
            String messageData = message.substring(4);
            System.out.println("模拟量数据, 报文内容: " + AsciiUtils.hexToAscii(messageData));

            // 处理数据
            List<ResultData> resultDataList = UnitEnum.dueMessage(message);
            if (CollectionUtil.isEmpty(resultDataList)) {return false;}

            // 保存数据到数据库
            for (ResultData resultData : resultDataList) {
                MangerGlobal.self.myyEquipmentWaterManger.saveRtuMessage(iccid, resultData.getDataType(), resultData.getDataUtil(), resultData.getDataValue());
            }
            return true;
        }
    },

    /** 心跳报文：在发送卡号报文之后 30 秒时，设备发送一次心跳包*/
    HEART_BEAT("4654") {

        @Override
        public boolean due(String iccid, String message) {
            System.out.println("心跳包");

            return true;
        }
    }
    ,
    ;

    DetectionMessageEnum(String messageHead) {
        this.messageHead = messageHead;
    }

    /**
     * 处理报文
     *
     * @param message 报文
     * @param iccid SIM 卡 ICCID
     * @return TRUE:处理成功; FALSE:处理失败
     *
     * @author 邱祥霸
     * @date 2020-03-28
     */
    abstract boolean due(String iccid, String message);

    /** 报头*/
    private String messageHead;

    /**
     * 处理报文
     *
     * @param message 报文
     * @param iccid SIM 卡 ICCID
     * @return RUE:处理成功; FALSE:处理失败
     *
     * @author 邱祥霸
     * @date 2020-03-28
     */
    public static boolean dueMessage(String iccid, String message) {
        try {
            // 保存数据到txt
            TxtUtils.write(message);

            // 获取请求头
            String messageHead = message.substring(0, 4);

            // 获取报文类型
            DetectionMessageEnum[] detectionMessageEnums = DetectionMessageEnum.values();
            for (DetectionMessageEnum detectionMessageEnum : detectionMessageEnums) {

                // 根据请求头处理数据
                if(detectionMessageEnum.messageHead.equals(messageHead)) {
                    return detectionMessageEnum.due(iccid, message);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    }
}
